package p.ithorns.integration.hazelcast.mqtt;


import java.io.Serializable;
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;

/**
 *
 */
public interface Topics {

    /**
     * 获取所有数据订阅主题
     *
     * @return String[]
     */
    static Set<Up> getDataTopics() {
        return Arrays.stream(Data.values()).collect(Collectors.toSet());
    }

    /**
     * 匹配订阅主题
     *
     * @param topic -被匹配主题
     * @return Topics.Up
     */
    static Up matchTopic(String topic) {
        Sys sys = Arrays.stream(Sys.values())
                .filter(item -> topic.startsWith(item.getTopic()))
                .findAny()
                .orElse(null);

        return null != sys
                ? sys
                : Arrays.stream(Data.values())
                .filter(item -> topic.startsWith(item.getTopic().replace("/{0}", "")))
                .findFirst()
                .orElse(null);
    }

    /**
     * 上报
     */
    interface Up extends Serializable {
        /**
         * 主题
         *
         * @return String
         */
        String getTopic();

        /**
         * 基础数据类
         *
         * @return Class<? extends BaseRaw>
         */
        Class<? extends BaseRaw> getRawClass();
    }

    /**
     * 系统上报
     */
    enum Sys implements Up {

        ;

        /**
         * 主题名称
         */
        private final String topic;

        /**
         * 源数据类型
         */
        private final Class<? extends BaseRaw> rawClass;

        Sys(String topic, Class<? extends BaseRaw> rawClass) {
            this.topic = topic;
            this.rawClass = rawClass;
        }

        @Override
        public String getTopic() {
            return topic;
        }

        @Override
        public Class<? extends BaseRaw> getRawClass() {
            return rawClass;
        }
    }


    /**
     * 数据上报
     */
    enum Data implements Up {

        /**
         * 心跳
         */
        HEART_BEAT("up/gw_heartbeat", HeartbeatUp.class),

        /**
         * 数据上报
         * {0}:替换为gw_id
         */
        GATE_RAW("up/data", GateUp.class),

        ;

        /**
         * 主题名称
         */
        private final String topic;

        /**
         * 源数据类型
         */
        private final Class<? extends BaseRaw> rawClass;

        Data(String topic, Class<? extends BaseRaw> rawClass) {
            this.topic = topic;
            this.rawClass = rawClass;
        }

        @Override
        public String getTopic() {
            return topic;
        }

        @Override
        public Class<? extends BaseRaw> getRawClass() {
            return rawClass;
        }

    }


}